---
id: 5a23c84252665b21eecc7ec5
title: Задача Йосипа Флавія
challengeType: 1
forumTopicId: 302294
dashedName: josephus-problem
---

# --description--

Задача Йосипа Флавія — це математична головоломка зі зловісною умовою: у колі стоять $n$ в’язнів, послідовно пронумерованих від $0$ до $n-1$.

Екзекутор ходить по колу. Він починає з в’язня під номером $0$, забирає із собою кожного $k$-го в’язня та вбиває його.

Коло стає все меншим і меншим, поки не залишиться лише один в’язень, якого потім відпускають.

Наприклад, якщо $n=5$ та $k=2$, то порядком вбитих в’язнів (назвемо це «послідовністю вбивств») буде 1, 3, 0 та 4, а №2 залишиться живим.

Дізнайтеся, хто з в’язнів виживе за будь-яких $n, k > 0$.

В одному з таких випадків був 41 в’язень, а кожен 3<sup>-ій</sup> був вбитий ($k=3$).

Серед них був розумний хлопець Йосип, який розв’язав цю задачу та обрав виграшну позицію, а згодом постійно розповідав про це.

Який номер він вибрав?

# --instructions--

Напишіть функцію, яка приймає початкову кількість в’язнів та `k` як параметри і повертає номер в’язня, який виживе.

# --hints--

`josephus` має бути функцією.

```js
assert(typeof josephus == 'function');
```

`josephus(30,3)` має повернути число.

```js
assert(typeof josephus(30, 3) == 'number');
```

`josephus(30,3)` має повернути `28`.

```js
assert.equal(josephus(30, 3), 28);
```

`josephus(30,5)` має повернути `2`.

```js
assert.equal(josephus(30, 5), 2);
```

`josephus(20,2)` має повернути `8`.

```js
assert.equal(josephus(20, 2), 8);
```

`josephus(17,6)` має повернути `1`.

```js
assert.equal(josephus(17, 6), 1);
```

`josephus(29,4)` має повернути `1`.

```js
assert.equal(josephus(29, 4), 1);
```

# --seed--

## --seed-contents--

```js
function josephus(init, kill) {

}
```

# --solutions--

```js
function josephus(init, kill) {
  const arr = Array.from(Array(init).keys());
  let curr = -1
  while (arr.length > 1) {
    curr = (curr + kill) % arr.length;
    arr.splice(curr, 1);
    curr--;
  }
  return arr[0];
}
```
